perm filename TENSOR.SAI[CRE,BGB] blob sn#039860 filedate 1973-05-03 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00007 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001	   VALID 00007 PAGES
 00002 00002	BEGIN "TENSOR"
 00003 00003	SUBR ACC			! ACCUMULATE PORTIONS
 00004 00004	SUBR TRI (ITG V1,V2)		! TRIANGULAR PORTION
 00005 00005	SUBR DPYGON
 00007 00006	SUBR ROTATE (REAL THETA)
 00009 00007		A1 ← 60*88
 00010 ENDMK
⊗;
BEGIN "TENSOR"
	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
	REQUIRE "DPYIII[SYS,BGB]" SOURCE_FILE;
	REQUIRE "SAITRG[SYS,BGB]" SOURCE_FILE;
	SAFE ITG ARRAY DPYBUF[0:500];

	PRELOAD_WITH 60,120,120,60;
	REAL ARRAY ROW [1:4];
	PRELOAD_WITH 100,100,188,188;
	REAL ARRAY COL [1:4];
	DEFINE NCNT="4";

	REAL DR,DC,R1,R2,C1,C2;

	REAL A, X, Y, MXX, MYY, PXY;	! PARTIALS;
	REAL A0,X0,Y0,MXX0,MYY0,PXY0;	! ACCUMULATORS;
	REAL A1,X1,Y1,MXX1,MYY1,PXY1;	! FIRST INERTIA TENSOR;
	REAL A2,X2,Y2,MXX2,MYY2,PXY2;	! SECOND INERTIA TENSOR;
	REAL MZZ,MZZ0,MZZ1,MZZ2;

	REAL PHI1,PHI2,CPHI1,SPHI1;
SUBR ACC;			! ACCUMULATE PORTIONS;
BEGIN "ACC"
	A0 ← A0 +A;
	X0 ← X0 + A*X;
	Y0 ← Y0 + A*Y;
	MXX0 ← MXX0 + MXX + Y*Y*A;
	MYY0 ← MYY0 + MYY + X*X*A;
	PXY0 ← PXY0 + PXY - X*Y*A;
END "ACC";

SUBR TOT;			! TOTAL INTERTIA;
BEGIN "TOT"
	A2 ← A0;
	X1 ← X0/A0;
	Y1 ← Y0/A0;
	OUTSTR(9&CVS(X1)&9&CVS(Y1)&↓);
	MXX2 ← MXX0 - Y1*Y1*A0;
	MYY2 ← MYY0 - X1*X1*A0;
	PXY2 ← PXY0 + X1*Y1*A0;
END "TOT";
SUBR TRI (ITG V1,V2);		! TRIANGULAR PORTION;
BEGIN "TRI"
	R1 ← ROW[V1]; R2 ← ROW[V2];
	C1 ← COL[V1]; C2 ← COL[V2];
	DC ← C2 - C1;
	DR ← R2 - R1;
	A  ← DC*DR/2;
	X  ← (2*C2+C1)/3;
	Y  ← (2*R1+R2)/3;
	MXX ← A*DR*DR/18;
	MYY ← A*DC*DC/18;
	PXY ← -A*A/18;
	ACC;
END "TRI";
SUBR REC (ITG V1,V2);		! RECTANGULAR PORTION;
BEGIN "REC"
	R1 ← ROW[V1]; R2 ← ROW[V2];
	C1 ← COL[V1]; C2 ← COL[V2];
	DC ← C2 - C1;
	DR ← R2 - R1;
	A  ← DC*R1;
	X  ← (C1+C2)/2;
	Y  ← R1/2;
	MXX ← A*R1*R1/12;
	MYY ← A*DC*DC/12;
	PXY ← 0;
	ACC;
END "REC";
SUBR DPYGON;
BEGIN "DPYGON"
	ITG I,X,Y;
! DISPLAY BORDER;
	DPYSET(DPYBUF);
	AIVECT(-500,-500);
	AVECT(+500,-500);
	AVECT(+500,+500);
	AVECT(-500,+500);
	AVECT(-500,-500);
! DISPLAY RECTANGLE;
	BEGIN
		X ← 3.5*(COL[NCNT]-144);
		Y ← 3.5*(108-ROW[NCNT]);
		AIVECT(X,Y);
	END;
	FOR I←1 TIL NCNT DO
	BEGIN
		X ← 3.5*(COL[I]-144);
		Y ← 3.5*(108-ROW[I]);
		AVECT(X,Y);
	END;

! DISPLAY FIRST AND SECOND FORMS OF THE INERTIA TENSOR;
	AIVECT(-450,400);DPYSST(CVG(MXX1));
	AIVECT(-450,370);DPYSST(CVG(MXX2));
	AIVECT(-250,400);DPYSST(CVG(MYY1));
	AIVECT(-250,370);DPYSST(CVG(MYY2));
	AIVECT(-75,400);DPYSST(CVG(MZZ1));
	AIVECT(-75,370);DPYSST(CVG(MZZ2));
	AIVECT(+100,400);DPYSST(CVG(PXY1));
	AIVECT(+100,370);DPYSST(CVG(PXY2));
	AIVECT(+300,400);DPYSST(CVG(A1));
	AIVECT(+300,370);DPYSST(CVG(A2));
	AIVECT(0,18*3.5);AVECT(CPHI1*100,18*3.5+SPHI1*100);
	DPYOUT(0);
	INCHRW;
END "DPYGON";
SUBR ROTATE (REAL THETA);
BEGIN "ROTATE"
	ITG I;REAL X,Y,C,S,TMP;
	C ← COS(THETA);
	S ← SIN(THETA);
	FOR I←1 TIL NCNT DO
	BEGIN
		X ← COL[I] - 144;
		Y ← 90 - ROW[I];
		TMP ← C*X - S*Y;
		Y   ← C*Y + S*X;
		X   ← TMP;
		ROW[I] ← (90 - Y);
		COL[I] ← (X + 144);
	END;
	MXX0 ← C*C*MXX1 + S*S*MYY1 + 2*C*S*PXY1;
	MYY0 ← C*C*MYY1 + S*S*MXX1 - 2*C*S*PXY1;
	PXY1 ← (C*C - S*S)*PXY1 + C*S*(MYY1-MXX1);
	MXX1 ← MXX0; MYY1 ← MYY0; MZZ1 ← MXX1 + MYY1;
	
	A0←X0←Y0←MXX0←MYY0←PXY0←0;	! ACCUMULATORS;
	TRI(1,2);REC(1,2);
	TRI(2,3);REC(2,3);
	TRI(3,4);REC(3,4);
	TRI(4,1);REC(4,1);
	TOT; MZZ2 ← MXX2 + MYY2;
	PHI1 ← ATAN2(2*PXY1,MYY1-MXX1)/2;
	CPHI1 ← COS(PHI1);
	SPHI1 ← SIN(PHI1);
END "ROTATE";
	A1 ← 60*88;
	MXX1 ← A1*60*60/12;
	MYY1 ← A1*88*88/12;
	PXY1 ← 0;
	ROTATE(0);
	WHILE TRUE DO
BEGIN "FOREVER"
	DPYGON;
	ROTATE(π/8);
END "FOREVER";

END "TENSOR";